﻿//
//  YHGameSceneManager.h
//  ThunderWarriors
//
//  Created by mac on 12-12-22.
//
//

#ifndef ThunderWarriors_YHGameSceneManager_h
#define ThunderWarriors_YHGameSceneManager_h
#include "cocos2d.h"
#include "YHSceneDefine.h"
#include "YHScene.h"
#include "YHLayerDefine.h"
#include "YHLayer.h"
#include "stdio.h"

using namespace std;
USING_NS_CC;

class YHGameSceneManager
{
public:
	static YHGameSceneManager *sharedGameSceneManager();
    /*释放单例*/
	static void purgeSharedGameSceneManager();
	virtual bool init();
    //获得当前场景
    YHScene* getRunningScene();
    
    //将scene加入到导演中
    void pushScene(YHScene* scene);
    //根据sceneClassName生成scene, 并加入到导演中,返回生成的scene指针
    YHScene* pushScene(string sceneClassName);
    YHScene* pushSceneWithId(string sceneClassName, GameSceneIdType sceneId);
   
    //用scene替换掉当前的scene
    void gotoScene(YHScene* scene);
    //根据sceneClassName(必须进行类注册)生成scene，并加入到导演中
    YHScene* gotoScene(string sceneClassName);
     //根据sceneClassName(必须进行类注册)生成scene，并设置sceneId，然后替换掉当前的scene.(sceneId必须预定义且唯一)
    YHScene* gotoSceneWithId(string sceneClassName, GameSceneIdType sceneId);
    
    //将当前的scene移除
    void popScene();

    //把layer加入到当前场景中，flag1,flag2,data用来传递数据
    YHLayer* openLayerByIdAndTag(string layerClassName, GameLayerIdType layerId, int flag1=0, int flag2=0, void* flagData=NULL);
    void pushLayer(YHLayer* layer);
    //根据layerClassName(必须进行类注册)生成layer，然后加入到当前场景中
    YHLayer* pushLayer(string layerClassName);
    YHLayer* pushLayerWithId(string layerClassName, GameLayerIdType layerId);
    
    //将layer从父节点移除
    void removeLayer(YHLayer* layer);
    //根据layerId，从父节点移除。 
    void removeLayerById(GameLayerIdType layerId);
    
    
    /*如果sceneId对应的scene已经存在，则返回该scene，否则返回NULL.
      如果队列中有多个scene对应同一个id，那么返回第一个找到的。*/
    YHScene* getSceneById(GameSceneIdType sceneId);
    
    //根据sceneClassName(必须进行类注册)生成对应的scene
    YHScene* createScene(string sceneClassName);
    YHScene* createSceneWithId(string sceneClassName, GameSceneIdType sceneId);
    
    /*如果layerId对应的layer已经存在，则返回该layer，否则返回NULL.
     如果队列中有多个layer对应同一个id，那么返回第一个找到的。*/
    YHLayer* getLayerById(GameLayerIdType layerId);
    
    //根据layerClassName(必须进行类注册)生成对应的layer
    YHLayer* createLayer(string layerClassName);
    YHLayer* createLayerWithId(string layerClassName, GameLayerIdType layerId);
    
    //移除所有的scene，但是director要求至少剩余一个，所以会剩余一个
    void removeAllScene();
    //移除当前场景的所有layer
    void removeAllLayer();
    
protected:
	YHGameSceneManager();
	virtual ~ YHGameSceneManager();
    
private:
	static YHGameSceneManager* m_sharedGameSceneManager;
    CCArray* m_arrayScenes;
    CCArray* m_arrayLayers;
    YHScene* m_curRunningScene;
};
#endif
